package com.xx.rpc.core.remoting.invoker.call;

/**
 * 消费端响应回调类
 *
 * @author hanxiyue
 */
public abstract class XxRpcInvokeCallback<T> {

    /**
     * 成功
     *
     * @param result 成功返回数据
     */
    public abstract void onSuccess(T result);

    /**
     * 失败
     *
     * @param exception 失败异常
     */
    public abstract void onFailure(Throwable exception);

    // ---------------------- 线程消费者回调 ----------------------

    //创建响应回调的本地变量
    private static ThreadLocal<XxRpcInvokeCallback> threadInvokerCallback = new ThreadLocal<XxRpcInvokeCallback>();

    /**
     * 获取响应回调的值
     *
     * @return
     */
    public static XxRpcInvokeCallback getCallback() {
        //get()方法是用来获取ThreadLocal（响应回调的本地变量）在当前线程中保存的变量副本
        XxRpcInvokeCallback invokeCallback = threadInvokerCallback.get();
        //remove()用来移除当前线程中变量的副本
        threadInvokerCallback.remove();
        return invokeCallback;
    }

    /**
     * 设置响应回调值
     *
     * @param invokeCallback 消费者回调
     */
    public static void setCallback(XxRpcInvokeCallback invokeCallback) {
        //set()用来设置当前线程中变量的副本
        threadInvokerCallback.set(invokeCallback);
    }

    /**
     * 移除响应回调值
     */
    public static void removeCallback() {
        //remove()用来移除当前线程中变量的副本
        threadInvokerCallback.remove();
    }

}
